﻿
package
{
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	
	import src.Circulo;
	import src.Cuadrado;
	import src.Figuras;
	import src.Hero;
	import src.Indicador_Caida;
	import src.Mapa;
	import src.Mov_Cuadro;
	import src.Triangulo;
	
	public class Jumper extends MovieClip
	{
		private var MovMapa:Mov_Cuadro = new Mov_Cuadro;
		private var cant:int = 9 ; 
		private var IndCad:Indicador_Caida = new Indicador_Caida;
		private var mapas:Array = new Array();
		private var idObj:int = 0 ;
		private var obj:Figuras; 
		private var casoObj:int ; /** Está variable es usada para definir que objetos del mapa se "caeran" */
		private var doorUp : Boolean ;
		private var m:int ; 
		private var cantMov:int = 15 ;/**Indica cuantos movimientos hecho por el teclado son necesario para que la secuencia de Caida se active*/
		private var condS : Boolean ;
		private var condD : Boolean ;
		private var condL : Boolean ;
		private var condR : Boolean ;
		private var movDirU : Boolean;
		private var movDirD : Boolean;
		private var movDirL : Boolean;
		private var movDirR : Boolean;
		private var bolCDE : Boolean ; /** Está variable es usada para definir que objetos del mapa se "caeran" */ 
		private var hero:Hero = new Hero ;
		private var mapa:Mapa = new Mapa();
		//private var mapa:Mapa = new Mapa();
		public function Jumper(){			
			addChild(MovMapa);			
			addChild(IndCad);			
			addChild(hero);			
			MovMapa.addChild(mapa);
			mapa.x = 450 ;
			mapa.y = 465 ;			
			
			/** Esta secuencia crea muchos mapas uno encima del otro, consideré no usarla debido a que se necesita que todas aquellas piezas seleccionadas por la función 
			 	CondCaidaElementos se "caigan" , es decir se necesita el mapa como una sola entidad para comprobar cada elemento que sea necesario.
				Por otro lado, aún no tengo idea de como hacer que se comprueba la caida xD*/ 
			/*
			for(var i:int = 0; i<cant;i++){
				var mapa:Mapa = new Mapa();
				mapas[i]=mapa;
				MovMapa.addChild(mapas[i]);
				mapas[i].x = 450  ; 
				mapas[i].y = -335 - i*1000;				
				
				}*/
		 	
			hero.x = stage.width/2 + 85  ;
			hero.y = 660;
			m = 0 ;
			bolCDE = true;
			doorUp = false ; 
			condS = true ;
			condD = true ;
			condL = true ;
			condR = true ;
			movDirU = false ;
			movDirD = false ;
			movDirL = false ;
			movDirR = false ;
			IndCad.x = 1130;
			stage.addEventListener(KeyboardEvent.KEY_DOWN, Mov_Hero);
			stage.addEventListener(KeyboardEvent.KEY_UP, Stop_Hero);			
			addEventListener(Event.ENTER_FRAME,onEnterFrame);							 
				
			
		}
		/**Adiere al display la figura clave y borra la anterior creada*/
		private function CondCaidaElementos(){					
						
			if ( idObj == 1 ) {
				idObj = 0 ;				
				IndCad.removeChild(obj);
			}
			casoObj= Math.floor(Math.random()*3+1);				
			switch(casoObj){
				case 1:	obj = new Circulo(); break;
				case 2:	obj = new Triangulo(); break ;
				case 3:	obj = new Cuadrado(); break;
			}				
			IndCad.addChild(obj);			
			obj.x = 75 ;
			obj.y = 75 ;			
			idObj++ ;	
			
			
		}
		
		private function Mov_Hero(e:KeyboardEvent) {
			switch(e.keyCode){
				case Keyboard.UP : movDirU = true ; 
								   doorUp = true ;   break;
				case Keyboard.DOWN : movDirD = true ; break;
				case Keyboard.LEFT : movDirL = true ; break;
				case Keyboard.RIGHT : movDirR = true ; break;
			}
		}
		
		private function Stop_Hero (e:KeyboardEvent) {
			switch(e.keyCode){
				case Keyboard.UP : movDirU = false ;
									condS = true ; break;
				case Keyboard.DOWN : movDirD = false;
									 condD = true ; break;
				case Keyboard.LEFT : movDirL = false ; 
									 condL = true ; break;				
				case Keyboard.RIGHT : movDirR = false ; 
					  				  condR = true ; break;
			}
		}
		
		private function onEnterFrame(e:Event) {
			/**Condición que crea la figura clave para que se inicie una de las dificultades del juego ( se caigan las figuras del mismo tipo)*/
			if ( (m%cantMov == 0) && (m != 0) && (bolCDE) ) {
				CondCaidaElementos() ;
				trace(obj);
				bolCDE = false ;				
			}
			
			/*if ((hero.hitTestObject(obj)) && (m >= cantMov)) {
				trace(m);
			}*/
			
			/** Condición para que el jugador pierda al salirse del mapa*/
			if ( (hero.hitTestObject(mapa) == false )  ) {
				if (hero.hitTestObject(MovMapa)){
				trace('U LOSE') ;
				}
			}
			/**Condición para que el jugagor pierda al pisar la plataforma incorrecta, se dan 2 movimientos adicionales al jugador para que no pierda instantaneamente ( incompleto )*/
			if ( m == cantMov + 2  ){				
			    if (hero.hitTestObject(mapa)) {
					trace('8');
				}
			}	
			
			if (m%cantMov != 0) { bolCDE = true; }
			
			/**Incia el movimiento relativo del mapa y del hero*/
			if (doorUp)  {
			MovMapa.y = MovMapa.y + 1;
			hero.y=hero.y+1;
			}			
			
			/**Las condiciones siguientes son para el movimiento del Hero. La variable m es usada para la creación de la figura que hará que se caigan las de su mismo tipo  */
			if ((movDirU) && (condS)){	
				hero.y -=200;								
				condS = false ;  
				m= m+1 ;
				trace(m);}
			if ((movDirD)&& (condD)){				 
				if (hero.y < 660 ){					
					hero.y +=200;
					condD = false ;
					m= m+1;
				}
			} 
			if ((movDirL)&& (condL)){
				if (hero.x > 445 ){					
				hero.x -=200;
				condL = false ;
				m= m+1;
				}
			}
			if ((movDirR)&& (condR)){
				if (hero.x < 1045 ){					
				hero.x +=200;
				condR = false ;
				m= m+1;
				}
			}
			
		}
	}
}